#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<unistd.h>
#include<pthread.h>

/*
	数数可能会少数
		1、线程1得到CPU的时间片，在执行第二句话以后失去CPU时间片，线程2得到CPU时间片，从内存中取num的值并没有更新，所有得到的是未+1的值，此时线程2进行+1，然后失去CPU时间片，线程1继续得到时间片接着从中断处执行，此时得到的结果与线程2得到的结果相同，覆盖线程2的结果，所以会出现少数的情况
		解决办法：线程的互斥操作

*/



#define NUM 5000
int num =0;

void* mythread(void *arg)
{
	printf("child thread,pid=[%d],id=[%ld]\n",getpid(),pthread_self());
	int i = 0;
	int n = 0;
	for(i;i<NUM;i++)
	{
		n = num;
		n++;
		num=n;
		printf("[1]==[%d]\n",num);
	}
}

void* mythread2(void *arg)
{
	printf("child thread,pid=[%d],id=[%ld]\n",getpid(),pthread_self());
	int i = 0;
	int n= 0;
	for(i;i<NUM;i++)
	{
		n = num;
		n++;
		num=n;
		printf("[2]==[%d]\n",num);
	}
}

int main()
{
	pthread_t thread1; //返回线程号	
	int ret = pthread_create(&thread1,NULL,mythread,NULL);

	if(ret != 0)
	{
		printf("thread creat error,[%s]\n",strerror(ret));
		return -1;
	} 
	pthread_t thread2; //返回线程号	
	int ret2 = pthread_create(&thread2,NULL,mythread2,NULL);

	if(ret2 != 0)
	{
		printf("thread creat error,[%s]\n",strerror(ret2));
		return -1;
	}

	//回收子线程
	pthread_join(thread1,NULL);
	pthread_join(thread2,NULL);	

	printf("num == [%d]\n",num);
	//目的是为了让子线程能够执行起来
	//sleep(1);

	return 0;
}
